#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define _CRT_ONEXIT_T_DEFINED
//int package(int sum, int every)
//{
//	int* children = (int*)malloc(sizeof(int) * every);
//	if (children == NULL)
//	{
//		perror("malloc fail");
//		return 0;
//	}
//	if (sum < every)
//		return -1;
//	for (int i = 0; i < every; i++)
//	{
//		children[i] = i + 1;
//		sum -= (i + 1);
//	}
//	if (sum < 0)
//	{
//		return -1;
//	}
//	return 1;
//}
//int main()
//{
//	int n,sum,every,j = 0;
//	scanf_s("%d", &n);
//	int** dst = (int**)malloc(sizeof(int*) * n);
//	if (dst == NULL)
//	{
//		perror("malloc fail");
//		return 0;
//	}
//	for (int i = 0; i < n; i++)
//	{
//		dst[i] = (int*)malloc(sizeof(int));
//		if (dst[i] == NULL)
//		{
//			perror("malloc fail");
//			return 0;
//		}
//	}
//	for (int i = 0; i < n; i++)
//	{
//		scanf_s("%d", &sum);
//		scanf_s("%d", &every);
//		dst[i][0] = package(sum, every);
//	}
//	for (int i = 0; i < n; i++)
//	{
//		if (dst[i][0] == 1)
//			printf("Yes\n");
//		else
//			printf("No\n");
//	}
//	for (int i = 0; i < n; i++)
//	{
//		free(dst[i]);
//	}
//	free(dst);
//	dst = NULL;
//	return 0;
//}
// 
// 
// 
//// #include<stdio.h>
//#include<stdlib.h>
//int create(int* dst, int* state, int n, int s, int a, int b)
//{
//	int sum = 0, num = 0;
//	for (int i = 2; i < n; i++)
//	{
//		if (state[i - 1] == 1)
//		{
//			dst[i] = dst[i - 1] - b;
//			state[i] = 0;
//		}
//		if (state[i - 1] == 0)
//		{
//			dst[i] = dst[i - 1] + a;
//			state[i] = 1;
//		}
//	}
//	for (int i = 0; i < n; i++)
//	{
//		sum += dst[i];
//	}
//	if (sum == s)
//		num += 1;
//	sum = 0;
//	for (int i = 2; i < n; i++)
//	{
//		if (state[i - 1] == 1)
//		{
//			dst[i] = dst[i - 1] + a;
//			state[i] = 1;
//		}
//		if (state[i - 1] == 0)
//		{
//			dst[i] = dst[i - 1] - b;
//			state[i] = 0;
//		}
//	}
//	for (int i = 0; i < n; i++)
//	{
//		sum += dst[i];
//	}
//	if (sum == s)
//		num += 1;
//	return num;
//}
//int judge(int n, int s, int a, int b)
//{
//	if (n == 1)
//		return 1;
//	int sum = 0;
//	int* state = (int*)malloc(sizeof(int) * n);
//	if (state == NULL)
//	{
//		perror("malloc fail");
//		return 0;
//	}
//	int* dst = (int*)malloc(sizeof(int) * n);
//	if (dst == NULL)
//	{
//		perror("malloc fail");
//		return 0;
//	}
//	for (int i = 0; i < s; i++)
//	{
//		dst[0] = i;
//		dst[1] = i + a;
//		state[1] = 1;
//		sum += create(dst, state, n, s, a, b);
//	}
//	for (int i = 0; i < s; i++)
//	{
//		dst[0] = i;
//		dst[1] = i - b;
//		state[1] = 0;
//		sum += create(dst, state, n, s, a, b);
//	}
//	return sum;
//}
//int main()
//{
//	int n, s, a, b;
//	int sum = 0;
//	scanf("%d %d %d %d", &n, &s, &a, &b);
//	sum += judge(n, s, a, b);
//	sum %= 100000007;
//	printf("%d", sum);
//	return 0;
//}
//



int create(int* dst, int* state, int n, int s, int a, int b)
{
    int sum = 0, num = 0;
    for (int i = 2; i < n; i++)
    {
        if (state[i - 1] == 1)
        {
            dst[i] = dst[i - 1] + a;
        }
        else
        {
            dst[i] = dst[i - 1] - b;
        }

    }
    sum = 0;
    for (int i = 0; i < n; i++)
    {
        sum += dst[i];
    }
    if (sum == s)
        num += 1;
    sum = 0;
    return num;
}

int judge(int n, int s, int a, int b)
{
    if (n == 1) return 1;

    int count = 0;
    int* state = (int*)malloc(sizeof(int) * n);
    int* dst = (int*)malloc(sizeof(int) * n);
    if (state == NULL || dst == NULL)
        return 0;

    for (long long x = -1000; x <= 1000; x++)
    {
        dst[0] = x;

        for (int state1 = 0; state1 < 2; state1++)
        {
            state[1] = state1;
            dst[1] = (state1 == 1) ? x + a : x - b;


            for (int i = 2; i < n; i++)
            {
                state[i] = 0;
                count += create(dst, state, n, s, a, b);
                state[i] = 1;
                count += create(dst, state, n, s, a, b);
            }
        }
    }

    count %= 1000000007;
    free(state);
    free(dst);
    return count;
}

int main()
{
    int n, s, a, b;
    scanf_s("%d %d %d %d", &n, &s, &a, &b);
    int sum = judge(n, s, a, b);
    printf("%d\n", sum % 1000000007);
    return 0;
}
//
//int getLength(int x) 
//{
//    int len = 0;
//    while (x > 0)
//    {
//        x /= 10;
//        len++;
//    }
//    return len;
//}
//
//    int dig(int x, int k)
//    {
//        int len = getLength(x);
//        if (k >= len) return 0;
//        int remove_high = len - k - 1;
//        while (remove_high > 0)
//        {
//            x /= 10;
//            remove_high--;
//        }
//
//        return x % 10;
//    }
//
//    int compare(int a, int b) 
//    {
//        int len_a = getLength(a);
//        int len_b = getLength(b);
//        int max_len = len_a + len_b;
//
//        for (int i = 0; i < max_len; i++) 
//        {
//            int digit_a = (i < len_a) ? dig(a, i) : dig(b, i - len_a);
//            int digit_b = (i < len_b) ? dig(b, i) : dig(a, i - len_b);
//            if (digit_a > digit_b) 
//                return 1;
//            if (digit_a < digit_b) 
//                return -1;
//        }
//
//        return 0; 
//    }
//
//    int compare_wrapper(const void* a, const void* b)
//    {
//        return compare(*(int*)a, *(int*)b);
//    }
//
//    int main() {
//        int n;
//        scanf_s("%d", &n);
//
//        int* arr = (int*)malloc(n * sizeof(int));
//        if (arr == NULL) {
//            perror("malloc failed");
//            return 1;
//        }
//
//        for (int i = 0; i < n; i++)
//        {
//            scanf_s("%d", &arr[i]);
//        }
//
//        
//        qsort(arr, n, sizeof(int), compare_wrapper);
//
//        
//        if (arr[0] == 0) 
//        {
//            printf("0\n");
//        }
//        else {
//            
//            for (int i = n - 1; i >= 0 ; i--) 
//            {
//                printf("%d", arr[i]);
//            }
//            printf("\n");
//        }
//
//        free(arr);
//        return 0;
//    }
